package org.example.Manager.Impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.example.Manager.ProductOrderManager;
import org.example.enums.PageEnum;
import org.example.mapper.ProductOrderMapper;
import org.example.model.ProductOrderDO;
import org.example.vo.ProductOrderVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @description:
 * @author: 谢超
 * @date: 2024/4/22 15:10
 */
@Component
public class ProductOrderManagerImpl implements ProductOrderManager {

    @Resource
    private ProductOrderMapper productOrderMapper;

    @Override
    public int add(ProductOrderDO productOrderDO) {
        return productOrderMapper.insert(productOrderDO);
    }

    @Override
    public ProductOrderDO findByOutTradeNoAndAccountNo(String outTradeNo, Long accountNo) {
        return productOrderMapper.selectOne(Wrappers.lambdaQuery(ProductOrderDO.class)
                .eq(ProductOrderDO::getOutTradeNo, outTradeNo)
                .eq(ProductOrderDO::getAccountNo, accountNo)
                .eq(ProductOrderDO::getDel, 0));
    }

    @Override
    public int updateOrderPayState(String outTradeNo, Long accountNo, String newState, String oldState) {
        return productOrderMapper.update(null,Wrappers.lambdaUpdate(ProductOrderDO.class)
                .eq(ProductOrderDO::getOutTradeNo, outTradeNo)
                .eq(ProductOrderDO::getAccountNo, accountNo)
                .eq(ProductOrderDO::getState, oldState)
                .eq(ProductOrderDO::getDel, 0)
                .set(ProductOrderDO::getState, newState));
    }

    @Override
    public Map<String, Object> page(int page, int size, Long accountNo, String state) {
        Page<ProductOrderDO> pageInfo = new Page<>(page, size);

        IPage<ProductOrderDO> orderDOIpage;

        if (StringUtils.isNotBlank(state)){
            orderDOIpage = productOrderMapper.selectPage(pageInfo, Wrappers.lambdaQuery(ProductOrderDO.class)
                    .eq(ProductOrderDO::getAccountNo, accountNo)
                    .eq(ProductOrderDO::getDel, 0));
        } else {
            orderDOIpage = productOrderMapper.selectPage(pageInfo, Wrappers.lambdaQuery(ProductOrderDO.class)
                    .eq(ProductOrderDO::getAccountNo, accountNo)
                    .eq(ProductOrderDO::getState, state)
                    .eq(ProductOrderDO::getDel, 0));
        }
        List<ProductOrderDO> records = orderDOIpage.getRecords();

        List<ProductOrderVO> productOrderVOList = records.stream().map(item -> {
            ProductOrderVO productOrderVO = new ProductOrderVO();
            BeanUtils.copyProperties(item, productOrderVO);
            return productOrderVO;
        }).collect(Collectors.toList());

        Map<String, Object> pageMap = new HashMap(3);
        pageMap.put(PageEnum.TOTAL_RECORD.name(), orderDOIpage.getTotal());
        pageMap.put(PageEnum.TOTAL_PAGE.name(), orderDOIpage.getPages());
        pageMap.put(PageEnum.CURRENT_SIZE.name(), orderDOIpage.getCurrent());
        pageMap.put(PageEnum.CURRENT_DATA.name(), productOrderVOList);
        return pageMap;
    }

    @Override
    public int del(Long productOrderId, Long accountNo) {
        return productOrderMapper.update(null, Wrappers.lambdaUpdate(ProductOrderDO.class)
                .eq(ProductOrderDO::getId, productOrderId)
                .eq(ProductOrderDO::getAccountNo, accountNo)
                .set(ProductOrderDO::getDel, 1));
    }
}
